
// 参见 <https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle>
function fisherYatesShuffle(sourceArray) {
    for (var i = 0; i < sourceArray.length - 1; i++) {
        var j = i + Math.floor(Math.random() * (sourceArray.length - i));

        var temp = sourceArray[j];
        sourceArray[j] = sourceArray[i];
        sourceArray[i] = temp;
    }
    return sourceArray;
}

// 从max
// TODO: 需要优化。如果max和size大小接近的时候，while循环会空耗很多次数。
// 例如，如果size只比max小1，那么也许要很多次重复才能取到最后几个元素，
// 这时候不如直接随机取一个值，然后反选即可。
// max: 样本的元素总数
// size: 要抽取的随机数组的元素数量
export function randomIndexes(max, size) {
  // 如果要返回的数量正好和max相同，或者比max还大，则直接返回样本的一个洗牌
  if (size >= max) {
    return fisherYatesShuffle([...Array(max).keys()]);
  }
  let idxs = new Set();
  while (idxs.size < size) {
    let idx = Math.floor(Math.random() * max);
    idxs.add(idx);
  }
  console.log("idex: ", Array.from(idxs));
  return Array.from(idxs);
}